package com.algorithm.dijkstra;

import java.net.BindException;
import java.util.Arrays;

public class VistiedVertex {
    //记录每个顶点是否被访问过
    public boolean[] already_arr;
    //每个顶点的前驱结点下标
    public int[] pre_visited;
    //记录从出发顶点到其他所有顶点的最短距离
    public int[] dis;

    /**
     * @param length 顶点个数
     * @param index 出发顶点下标
     */
    public VistiedVertex(int length,int index){
        this.already_arr = new boolean[length];
        this.pre_visited = new int[length];
        this.dis = new int[length];
        //初始化数组
        Arrays.fill(dis,65535);
        //设置出发顶点的距离为0,且已被访问
        dis[index] = 0;
        already_arr[index] = true;
    }

    /**
     * 更新出发顶点到index顶点的距离
     */
    public void updateDis(int index,int len){
        dis[index] = len;
    }

    /**
     * 在进行广度搜索时更新结点pre的前驱结点index
     */
    public void updatePre(int pre,int index){
        pre_visited[pre] = index;
    }

    /**
     * 功能：返回出发顶点到index之间的距离
     */
    public int getDis(int index){
        return dis[index];
    }


    /**
     * 更新完index顶点距离和前驱结点后，找到一个距离最短的结点，并设置已访问
     * 放回当前距离最小顶点下标
     */
    public int updateArr(){
        int min = 65535;
        int index = 0;
        for(int i = 0;i<already_arr.length;i++){
           if(!already_arr[i] && dis[i] < min){
               min = dis[i];
               index = i;
           }
        }
        already_arr[index] = true;
        return index;
    }

    public void show(){
        System.out.println(Arrays.toString(already_arr));
        System.out.println(Arrays.toString(pre_visited));
        System.out.println(Arrays.toString(dis));
    }

}